home *** CD-ROM | disk | FTP | other *** search
Text File | 1991-06-21 | 60.2 KB | 2,104 lines |
- Include "equ.h"
- Include "impequ.h"
-
-
-
- SECTION DR2D,CODE,PUBLIC
- ***************************************************
- *** ***
- ***************************************************
- dumbentry:
- clr.l d0
- rts
-
- dc.l "IMPO" ; magik number for pic import
- dc.w 201
- dc.l 0
-
- table: dc.l 0
- dc.l name,special,check,DR2D
-
-
- ***************************************
- *** Is it really IFF DR2D? ***
- ***************************************
- check: move.l table,a0
- move.l buff1(a0),a1
- move.l (a1),a1
- cmp.l #"FORM",(a1)
- bne never
- cmp.l #"DR2D",8(a1)
- bne never
- bra right
-
- ***********************************
- *** ***
- ***********************************
- DR2D: move.l sp,savesp
-
- move.l table,a0 ;open the file
- move.l f_openr(a0),a0
- jsr (a0)
- bne impobj
-
- rts
-
- *********************************
- * *
- *********************************
- impobj:
- ;init variables
- clr.l cmaptab ;zero pointers
- clr.l cmyktab
- clr.l cnamtab
- clr.w numcolors ;numcolors = 0
- clr.l flag ;set flag to 0
- clr.l gsp ;set group stack counter to 0;
- move.l #$00e10000,fact1 ;default to inch incase no PPRF chunk
- move.w #72,fact100
- move.l #36,exp1
-
- move.l table,a0 ;open the object
- move.l o_open(a0),a0
- jsr (a0)
- beq abort0
-
- move.l table,a0 ;start a group
- move.l o_begingroup(a0),a0
- jsr (a0)
-
- bsr getpicinfo ;get the object's data
-
- move.l table,a0 ;end the group
- move.l o_endgroup(a0),a0
- jsr (a0)
-
- bsr freemem ;free all the memory m_alloc'ed
-
- move.l table,a0 ;close the object
- move.l o_close(a0),a0
- jsr (a0)
-
- move.l table,a0 ;close the file
- move.l f_closer(a0),a0
- jsr (a0)
-
- rts ;finished - return to PageStream
-
-
- *********************************
- * *
- *********************************
- abortobj:
- move.l table,a0
- move.l o_abort(a0),a0
- jsr (a0)
-
- abort0: move.l table,a0
- move.l f_closer(a0),a0
- jmp (a0)
-
-
- *********************************
- * *
- *********************************
- getpicinfo:
- bsr pgetl ; "FORM"
- bsr pgetl ; length of form
- move.l d0,length
- bsr pgetl ; "DR2D"
- sub.l #4,length
-
- getchunk:
- bsr pgetl ;get chunk type in temp
- move.l d0,temp
- bsr pgetl ;get chunk length in clength
- move.l d0,clength
- sub.l #8,length ;sub 8 from length of file left
- move.l temp,d0
-
- lea chunks-4,a0 ;get address of chunk table
- move.w numchunks,d1 ;number of chunks in table
-
- gc1: lea 4(a0),a0 ;get address of next chunk type
- cmp.l (a0)+,d0
- dbeq d1,gc1 ;loop until end of table or a match
-
- move.l (a0),a0 ;get address of routine to use for this chunk
- jsr (a0) ;do it
-
- tst.l length ;is there any data left in the FORM?
- bne getchunk ;yes
-
- bclr #2,flag ;attr is valid only for this form
-
- rrts: rts ;everything is OK
-
-
- ***********************************
- *** ***
- ***********************************
- attr: bset #2,flag ;set attr flag to found
- bsr pget
- move.b d0,filltype
- bsr pget
- move.b d0,jointype ;only miter and rounded supported
- bsr pget
- move.b d0,edgepattern ;id of dash pattern to use
- bsr pget
- move.b d0,arrowhead ;id of arrow head to use
- bsr pgetw
- move.w d0,fillvalue ;color or object to fill with
- bsr pgetw
- move.w d0,edgecolor ;color of edge line
- bsr pgetw ;skip layer info
- bsr getieee7200
- move.l d0,linewidth ;width of edge line
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- arow: bsr pget ;arrow flags
- move.b d0,aflags
- bsr pget ;throw away this byte
- bsr pgetw
- lea arrowtable,a1
- move.b aflags,0(a1,d0.w) ;store arrow flags in table
-
- arow1: subq.l #4,clength ;adjust length for what i read
- subq.l #4,length
- bra skip ;skip the rest
-
- ***********************************
- *** ***
- ***********************************
- bbox: bset #0,flag ;the next obj has a bounding box
-
- bsr getieee7200
- move.l d0,object+ob_Left
-
- bsr getieee7200
- move.l d0,object+ob_Top
-
- bsr getieee7200
- move.l d0,object+ob_Right
-
- bsr getieee7200
- move.l d0,object+ob_Bottom
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- cnam: tst.w numcolors ;has a CMAP or CMYK chunk been found?
- beq skip ;no, so skip the names
-
- tst.l cnamtab ;has a cnamtab been allocated yet?
- bne cnam1 ;yes, so don't do it again
- clr.l d0
- move.w numcolors,d0
- lsl.l #2,d0
- clr.l d1
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
- move.l a0,cnamtab
-
- move.l (a0),a0 ;clear the cnam table pointers
- move.w numcolors,d0
- cnam0: clr.l (a0)+
- dbf d0,cnam0
-
- cnam1: bsr pgetw ;get the starting color index number
- move.l d0,start
- bsr pgetw ;get the ending color index number
- move.l d0,end
-
- move.l clength,d0 ;get memory to read chunk contents into
- subq.l #4,d0
- move.l d0,temp
- clr.l d1
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
- move.l a0,cnamchunk
- move.l (a0),a1
-
- cnam2: move.l a1,-(sp)
- bsr pget ;read in chunk contents
- move.l (sp)+,a1
- move.b d0,(a1)+
- cnam3: sub.l #1,temp
- bne cnam2
-
- bsr putcnam ;put the color names into cnamtab
-
- move.l cnamchunk,a0 ;free memory needed for cnam chunk
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- cmap: move.l clength,d0
- move.l d0,d1
- divu #3,d1 ;d0 = number of color defs
- move.w d1,numcolors
- move.w d1,tempw1
- add.w d1,d0 ;d0 = total length of my cmap struct
- clr.l d1
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
-
- bset #6,flag ;bit 6 = CMAP found
- move.l a0,cmaptab
- move.l (a0),a0
-
- cmap1: move.l a0,-(sp)
- bsr pget
- move.b d0,red
- bsr pget
- move.b d0,green
- bsr pget
- move.b d0,blue
- move.l (sp)+,a0
- move.b #0,(a0)+ ;pagestream equiv color code
- move.b red,(a0)+ ;red
- move.b green,(a0)+ ;green
- move.b blue,(a0)+ ;blue
-
- subq.w #1,tempw1
- bne cmap1
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- cmyk: move.l clength,d0
- move.l d0,d1
- divu #4,d1 ;d0 = number of color defs
- move.w d1,numcolors
- move.w d1,tempw1
- add.w d1,d0 ;d0 = total length of my cmap struct
- clr.l d1
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
-
- bset #6,flag ;bit 6 = CMAP found
- move.l a0,cmyktab
- move.l (a0),a0
-
- cmyk1: move.l a0,-(sp)
- bsr pget
- move.b d0,cyan
- bsr pget
- move.b d0,magenta
- bsr pget
- move.b d0,yellow
- bsr pget
- move.b d0,black
-
- move.l (sp)+,a0
- move.b #0,(a0)+ ;pagestream equiv color code (0=none)
- move.b cyan,(a0)+ ;cyan
- move.b magenta,(a0)+ ;magenta
- move.b yellow,(a0)+ ;yellow
- move.b black,(a0)+ ;black
-
- subq.w #1,tempw1
- bne cmyk1
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- cply: btst #4,flag ;is this a fill object?
- bne cply1 ;yes - so skip
-
- bset #3,flag ;set closed poly flag
- bra ply ;do poly stuff
-
- cply1: bclr #4,flag ;clear the fill flag
- bra skip
-
- ***********************************
- *** ***
- ***********************************
- dash: bsr pgetw ;get id of dash
- move.w d0,dashid ;id of 0 means no line at all
- bsr pgetw
- move.w d0,numdashes ;numdashes of 0 means solid line
-
- lea dashtable,a1
- move.w dashid,d0
- cmp.w #0,dashid
- bne dash1
- move.b #0,d1
- bra dash3
-
- dash1: cmp.w #0,numdashes
- bne dash2
- move.b #1,d1
- bra dash3
-
- dash2: move.b #5,d1
- dash3: move.b d1,0(a1,d0.w) ;store dash code: 0 = no line
- ;1 = solid line, 5 = dashed line
- subq.l #4,length
- subq.l #4,clength
- bne dash4
- rts
-
- dash4: bra skip
-
-
- ***********************************
- *** ***
- ***********************************
- drhd:
- clr.l flag2
- bsr getieee7200
- move.l d0,xleft
- bsr getieee7200
- move.l d0,ytop
- bsr getieee7200
- move.l d0,xright
- bsr getieee7200
- move.l d0,ybottom
-
- move.l xleft,d0 ;is xleft<xright?
- cmp.l xright,d0
- ble drhd1 ;yes
- bset #0,flag2
-
- drhd1: move.l ytop,d0 ;is xtop<xbottom?
- cmp.l ybottom,d0
- ble drhd2 ;yes
- bset #1,flag2
-
- drhd2: bra adjlen
-
-
- ***********************************
- *** ***
- ***********************************
- fill: bset #4,flag ;the next object is a fill object
- bra skip
-
-
- ***********************************
- *** ***
- ***********************************
- fons: bsr pget
- move.b d0,fontid
- bsr pgetw ;throw away 2 bytes
- bsr pget
- move.b d0,serifflag
- move.l clength,d3 ;get the font name
- subq.l #4,d3
-
- lea buffer,a2
- fons1: bsr pget
- move.b d0,(a2)+
- subq.l #1,d3
- bne fons1
- clr.b (a2)
-
- lea buffer,a0
- move.l table,a1
- clr.l d0
- move.l findfontname(a1),a1
- jsr (a1)
- bne fons2 ;found font!
-
- clr.l d0
- move.b serifflag,d0 ;serif flag. 1=SERIF; 0=SANSERIF (?)
- or.l #$ff000000,d0
-
- fons2: lea fonttable,a0
- clr.w d1
- move.b fontid,d1
- lsl.w #2,d1
- move.l d0,0(a0,d1.w)
- bra fons3
-
- fons3: bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- form: btst #4,flag ;is this a fill form?
- bne form1 ;yes!
-
- move.l length,-(sp)
- move.l clength,-(sp)
- move.l clength,length
- bsr pgetl ;'DR2D'
- subq.l #4,length
-
- bsr getchunk ;handle nested FORM's
-
- move.l (sp)+,clength
- move.l (sp)+,length
-
- btst #5,flag ;did i finish a grup?
- beq form0 ;no
-
- move.l table,a0 ;yes - so end the group
- move.l o_endgroup(a0),a0
- jsr (a0)
-
- sub.l #1,gsp ;decrement the group stack counter
- bne form0 ;if not zero, I'm still in a group
-
- bclr #5,flag ;else clear group flag
-
- form0: bra adjlen
-
- form1: bclr #4,flag
- bra skip
-
- ***********************************
- *** ***
- ***********************************
- grup: bsr pgetw
- tst.w d0
- beq grup1
-
- bset #5,flag ;bit 5 = GRUP chunk
- move.l table,a0
- move.l o_begingroup(a0),a0
- jsr (a0)
-
- add.l #1,gsp ;increment the group stack counter
-
- grup1: bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- oply: btst #4,flag ;is this a fill object?
- bne oply1 ;yes
-
- bclr #3,flag ;clear closed poly flag
- bra ply ;do poly stuff
-
- oply1: bclr #4,flag ;clear the fill flag
- bra skip
-
-
- ***********************************
- *** ***
- ***********************************
- pprf: move.l clength,d1
-
- lea buffer,a0
- bra pprf2
- pprf1: move.l a0,-(sp)
- move.w d1,-(sp)
- bsr pget
- move.w (sp)+,d1
- move.l (sp)+,a0
- move.b d0,(a0)+
- pprf2: dbf d1,pprf1
-
- lea buffer,a0 ;is it in inches?
- lea inch,a1 ;inches = 7200
- pprf3: cmp.b (a0)+,(a1)+
- bne pprf4
- tst.b (a1)
- bne pprf3
- move.l #$00e10000,fact1
- move.w #72,fact100
- move.l #36,exp1 ;exponent for 7200 (12) + 24
- bra adjlen
-
- pprf4: lea buffer,a0 ;is it in picas?
- lea pica,a1 ;pica = 1200
- pprf5: cmp.b (a0)+,(a1)+
- bne pprf6
- tst.b (a1)
- bne pprf5
- move.l #$00960000,fact1
- move.w #12,fact100
- move.l #34,exp1 ;exponent for 1200 (10) + 24
- bra adjlen
-
- pprf6: lea buffer,a0 ;is it in inches?
- lea cm,a1 ;cm = 2835
- pprf7: cmp.b (a0)+,(a1)+
- bne pprf8
- tst.b (a1)
- bne pprf7
- move.l #$00b13000,fact1
- move.w #28,fact100
- move.l #35,exp1 ;exponent for 2836 (11) + 24
- bra adjlen
-
- pprf8: move.l #$00e10000,fact1 ;unknown type so - default to inches
- move.w #72,fact100
- move.l #36,exp1
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- stxt: bsr setobjdef
-
- bsr pgetw
- move.w d0,fontid
- bsr getieee7200
- move.l d0,charw
- bsr getieee7200
- move.l d0,charh
- bsr getieee7200
- move.l d0,basex
- bsr getieee7200
- move.l d0,basey
- bsr getieee
- move.l d0,rotation
- bsr pgetw
- move.w d0,numchars
-
- move.l table,a0
- move.l m_alloc(a0),a0
- clr.l d1
- clr.l d2
- clr.l d0
- move.w numchars,d0
- jsr (a0)
- beq errrts
-
- move.l a0,string
- move.l (a0),a0
- move.w numchars,d1
- bra stxt2
-
- stxt1: move.l a0,-(sp)
- move.w d1,-(sp)
- bsr pget
- move.w (sp)+,d1
- move.l (sp)+,a0
- move.b d0,(a0)+
- stxt2: dbf d1,stxt1
-
- btst #0,flag ;does this object have a bounding box?
- bne stxt3 ;yes!
-
- move.l basex,d0
- move.l d0,object+ob_Left
- move.l charw,d1
- mulu numchars,d1
- add.l d1,d0
- sub.l charw,d0
- move.l d0,object+ob_Right
-
- move.l basey,d0
- move.l d0,object+ob_Bottom
- move.l charh,d1
- mulu #5,d1
- divu #26,d1
- and.l #$0000ffff,d1
- add.l d1,d0
- move.l d0,object+ob_Bottom
- sub.l charh,d0
- move.l d0,object+ob_Top
-
- stxt3: move.w #25,object+ob_LWidth
- move.b #0,object+ob_LType
- move.b #ttxt,object+ob_Type
-
- btst #2,flag ;was an ATTR chunk found?
- beq stxt30 ;no
-
- cmp.b #1,filltype ;is it filled with a color?
- bne stxt30 ;no
-
- move.w fillvalue,d0
- bsr addcolor
- move.b d0,object+ob_FColor
- move.w edgecolor,d0
- bsr addcolor
- move.b d0,object+ob_LColor
-
- stxt30: bsr putobj
-
- lea column,a0
- move.b #1,cm_LCalc(a0)
- move.b #1,cm_QCalc(a0)
-
- move.l object+ob_Left,cm_Left(a0)
- move.l object+ob_Top,cm_Top(a0)
- move.l #$7fffff,cm_Right(a0)
- move.l #$7fffff,cm_Bottom(a0)
-
- clr.w cm_Flag(a0)
-
- lea fonttable,a1
- move.w fontid,d0
- lsl.w #2,d0
- cmp.b #$ff,0(a1,d0.w)
- beq st0
-
- move.l 0(a1,d0.w),d0
- move.l d0,cm_Font(a0)
- bra st2
-
- st0: move.l 0(a1,d0.w),d1
- move.l #1000,d2
- tst.b d1
- beq st1
- move.l #5000,d2
- st1: move.l d2,cm_Font(a0)
-
- st2: clr.l cm_Attrb(a0)
- move.l charw,cm_XPoint(a0)
- move.l charh,cm_YPoint(a0)
- clr.w cm_Spacing(a0)
- move.w #$8000,cm_Lead(a0)
- clr.w cm_BMod(a0)
- clr.w cm_PIndent(a0)
- clr.w cm_LIndent(a0)
- clr.w cm_RIndent(a0)
- clr.b cm_Tag(a0)
- clr.b cm_Justify(a0) ;block left
- ;move.b #9,cm_CFill(a0)
- move.b #9,cm_CFStyle(a0) ; fill style?
- move.b #1,cm_CFColor(a0)
- clr.b cm_CLStyle(a0)
- clr.w cm_CLWidth(a0)
- clr.b cm_CLColor(a0)
-
- clr.l cm_Tabs(a0)
-
- move.l #cm_Sizeof,d0
- move.l table,a0
- move.l o_malloc(a0),a0
- jsr (a0)
- bne stxt31
-
- move.l string,a0
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- bra errrts
-
- stxt31: lea column,a1
- move.w #cm_Sizeof,d0
- lsr.w #1,d0
- bra stxt5
- stxt4: move.w (a1)+,(a0)+
- stxt5: dbf d0,stxt4
-
- clr.l d0
- move.w numchars,d0
- subq.w #1,d0
- move.l table,a0
- move.l o_putl(a0),a0
- jsr (a0)
-
- move.l table,a0
- move.l o_malloc(a0),a0
- clr.l d0
- move.w numchars,d0
- bclr #0,d0
- jsr (a0)
- bne stxt6
-
- move.l string,a0
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- bra errrts
-
- stxt6: move.l string,a1
- move.l (a1),a1
- clr.l d0
- move.w numchars,d0
- subq.w #1,d0
- bra stxt8
-
- stxt7: move.b (a1)+,(a0)+
- stxt8: dbf d0,stxt7
-
- move.l string,a0
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- skip: move.l clength,d0
- add.l #1,d0
- bclr #0,d0
- sub.l d0,length
-
- sk1: move.l d0,-(sp)
- bsr pgetw
- move.l (sp)+,d0
- sub.l #2,d0
- bgt sk1
- rts
-
-
- ***********************************
- *** ***
- ***********************************
- ply:
- bsr setobjdef ;set up default values for the object
- bsr pgetw
- move.w d0,count ;d4 = number of point pairs to read
-
- mulu #10,d0 ;max bytes per pair = 10
- btst #3,flag ;is this a close poly?
- bne ply1 ;yes!
- add.l #ply_Sizeof+4,d0 ;4 = newpath+strokepath
- bra ply2
-
- ply1: add.l #ply_Sizeof+6,d0 ;6 = new+close+(fill or stroke)
-
- ply2: clr.l d1 ;allocate temp memory for object data
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
-
- move.l a0,mptr
- move.l (a0),a4
- lea ply_Sizeof(a4),a4
- move.l a4,pptr
-
- cmp.w #2,count ;is it a line? (2 points)
- beq ply3 ;no
- move.b #tpoly,object+ob_Type
- bra ply4
-
- ply3: move.b #tdln,object+ob_Type
-
- ply4: move.w count,d0
- move.l pptr,a0
- move.w #NEWPATH,(a0)+
- bclr #1,flag ;clear first point flag - not found
- move.w #ply_Sizeof+2,len ;set starting length of poly stuff
- move.w #1,numcom ;set poly command counter to 1
-
- btst #0,flag ;is there a bbox for this object
- bne ply10
-
- move.l #$7fffffff,object+ob_Left ;init to very large for checkLR
- move.l #$7fffffff,object+ob_Top
-
- move.l #$80000000,object+ob_Right ;init to very small for checkTB
- move.l #$80000000,object+ob_Bottom
-
- ply10: bsr getieee7200 ;convert fp num in d0 to integer
- bne ply18 ;check for INDICATOR
-
- move.l a0,-(sp)
- bsr pgetl ;get INDICATOR option
- move.l (sp)+,a0
- subq.w #1,count
- and.l #$00000003,d0 ;mask off all but lower 2 bits
- cmp.l #1,d0 ;1=CURVETO
- beq ply15
- cmp.l #2,d0 ;2=MOVETO
- beq ply14
- cmp.l #3,d0 ;3=BOTH
- beq ply13
-
- ;do something if not any of these - should never happen
-
- ply13: move.w #MOVETO,(a0)+
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkLR ;check Left & Right bounds
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB ;check Top & Bottom bounds
-
- move.w #CURVETO,(a0)+ ;bezier curve - first control point
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB
-
- bsr getieee7200 ;second control point
- move.l d0,(a0)+
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB
-
- bsr getieee7200 ;third is the end point of the curve
- move.l d0,(a0)+
- move.l d0,prevx
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevy
- bsr checkTB
-
- subq.w #4,count ;always uses four points
- add.w #36,len
- addq.w #2,numcom
- bra ply19
-
- ply14: move.w #MOVETO,(a0)+
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevx
- bsr checkLR ;check Left & Right bounds
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevy
- bsr checkTB ;check Top & Bottom bounds
-
- subq.w #1,count ;adjust counts
- add.w #10,len
- addq.w #1,numcom
- bra ply19
-
- ply15: btst #1,flag ;is this the first point?
- bne ply16 ;no
-
- bset #1,flag ;set first point flag to FOUND
- move.w #MOVETO,(a0)+
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB
- addq.w #1,numcom
- add.w #10,len
- bra ply17
-
- ply16: bsr getieee7200 ;get the first point
- move.l d0,saveX ;save it incase...
- cmp.l prevx,d0 ;is it the same as the last X coord?
- beq ply165 ;yes, so check the Y coord
-
- move.w #LINETO,(a0)+ ;if not, do a LINETO
- move.l d0,(a0)+
- bsr checkLR ;check Left & Right bounds
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB ;check Top & Bottom bounds
-
- add.w #10,len
- addq.w #1,numcom
- bra ply17
-
- ply165: bsr getieee7200 ;get the first point
- move.l d0,saveY ;save it incase
- cmp.l prevy,d0 ;is it the same as the last Y coord?
- beq ply17 ;yes, so skip it!
-
- move.w #LINETO,(a0)+ ;if not, do a LINETO
- move.l saveX,d0
- move.l d0,(a0)+
- bsr checkLR ;check Left & Right bounds
- move.l saveY,d0
- move.l d0,(a0)+
- bsr checkTB ;check Top & Bottom bounds
-
- add.w #10,len
- addq.w #1,numcom
-
- ply17: move.w #CURVETO,(a0)+ ;bezier curve - first control point
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB
-
- bsr getieee7200 ;second control point
- move.l d0,(a0)+
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- bsr checkTB
-
- bsr getieee7200 ;third is the end point of the curve
- move.l d0,(a0)+
- move.l d0,prevx
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevy
- bsr checkTB
-
- subq.w #4,count ;always uses four points
- add.w #26,len
- addq.w #1,numcom
- bra ply19
-
- ply18: btst #1,flag ;is this the first point?
- bne ply181 ;no
-
- move.w #MOVETO,(a0)+
- bset #1,flag ;set first point flag to FOUND
- move.l d0,(a0)+
- move.l d0,prevx
- bsr checkLR
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevy
- bsr checkTB
- bra ply182
-
- ply181: move.w #LINETO,(a0)+
- move.l d0,(a0)+
- move.l d0,prevx
- bsr checkLR ;check Left & Right bounds
- bsr getieee7200
- move.l d0,(a0)+
- move.l d0,prevy
- bsr checkTB ;check Top & Bottom bounds
-
- ply182: subq.w #1,count
- add.w #10,len
- addq.w #1,numcom
-
- ply19: tst.w count
- bne ply10
-
- btst #2,flag ;was an attr chunk found?
- beq ply200 ;no
-
- move.l linewidth,d0
- beq ply191
- move.w d0,object+ob_LWidth ;set object line width
-
- move.w edgecolor,d0
- bsr addcolor
- move.b d0,object+ob_LColor ;set objects line color
-
- ply191: lea dashtable,a1
- clr.w d0
- move.b edgepattern,d0
- move.b 0(a1,d0.w),object+ob_LType ;set objects line type
-
- ply192: lea arrowtable,a1
- clr.w d0
- move.b arrowhead,d0
- btst #0,0(a1,d0.w) ;draw arrow on first point
- beq ply193
- move.b #1,object+ob_LBegin
-
- ply193: btst #1,0(a1,d0.w)
- beq ply200
- move.b #1,object+ob_LEnd ;draw arrow on last point
-
- ply200: btst #3,flag ;is it a close poly?
- beq ply202 ;no!
-
- move.w #CLOSEPATH,(a0)+
- addq.w #1,numcom
- addq.w #2,len
-
- cmp.b #tdln,object+ob_Type ;is it a line?
- bne ply201 ;no
- move.l -16(a0),object+ob_Top
- move.l -6(a0),object+ob_Bottom
- bsr putobj
- bra ply23 ;no poly info for a tdln
-
- ply201: btst #2,flag ;was an attr chunk found?
- beq ply202 ;no
-
- cmp.b #1,filltype ;is it filled with a color?
- bne ply202 ;no - so skip fill
-
- move.b #9,object+ob_FType ;yes - set fill type to #9 (solid)
- move.w #FILLPATH,(a0)+
- addq.w #1,numcom
- addq.w #2,len
- move.w fillvalue,d0
- bsr addcolor
- move.b d0,object+ob_FColor ;set the objects color
-
- bra ply203
-
- ply202: move.w #STROKEPATH,(a0)+
- addq.w #1,numcom
- addq.w #2,len
-
- cmp.b #tdln,object+ob_Type ;is it a line?
- bne ply203 ;no
-
- move.l -16(a0),object+ob_Top
- move.l -6(a0),object+ob_Bottom
-
- bsr putobj
- bra ply23 ;no poly info for a tdln
-
- ply203: move.l mptr,a0
- move.l (a0),a0
- clr.l d0
- move.w len,d0
- move.l d0,ply_Length(a0)
-
- move.l object+ob_Right,d0
- sub.l object+ob_Left,d0
- move.l d0,ply_Width(a0)
-
- move.l object+ob_Bottom,d0
- sub.l object+ob_Top,d0
- move.l d0,ply_Height(a0)
-
- move.w #100,ply_XScale(a0)
- move.w #100,ply_YScale(a0)
- move.w numcom,ply_Count(a0)
-
- lea ply_Sizeof(a0),a0 ;set a0 to start of poly data
- move.w numcom,d0 ;set d0 to number of 'commands'
- bsr adjcoords ;adjust coords to ob_Left & ob_Top
-
- bsr putobj
-
- move.l mptr,a0 ;allocate memory for actual object
- move.l (a0),a0
- move.l (a0),d0
- move.l table,a0
- move.l o_malloc(a0),a0
- jsr (a0)
- beq errrts
-
- move.l mptr,a1 ;copy data into object
- move.l (a1),a1
- move.l (a1),d0
- lsr.w #1,d0
- bra ply22
- ply21: move.w (a1)+,(a0)+
- ply22: dbf d0,ply21
-
-
- ply23: move.l mptr,a0 ;free temp memory for object data
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- bclr #0,flag ;bounding box only for this object
-
- bra adjlen
-
- ***********************************
- *** ***
- ***********************************
- adjlen: move.l clength,d0
- btst #0,d0
- beq al1
- bsr pget
- move.l clength,d0
- add.l #1,d0
-
- al1: sub.l d0,length
- rts
-
- *********************************
- * *
- *********************************
- pgetl: move.l table,a0
- move.l f_getl(a0),a0
- jsr (a0)
- beq errrts
- rts
-
- *********************************
- * *
- *********************************
- pgetw: move.l table,a0
- move.l f_getw(a0),a0
- jsr (a0)
- beq errrts
- and.l #$0000ffff,d0 ;clean up d0
- rts
-
- *********************************
- * *
- *********************************
- pget: move.l table,a0
- move.l f_get(a0),a0
- jsr (a0)
- beq errrts
- and.l #$000000ff,d0 ;clean up d0
- rts
-
- ***********************************
- *** ***
- ***********************************
- Mulu3232:
- move.l table,a0
- move.l mulu3232(a0),a0
- jmp (a0)
-
-
- ***********************************
- *** ***
- ***********************************
- Divu1648:
- move.l table,a0
- move.l divu1648(a0),a0
- jmp (a0)
-
-
- ************************************************************
- *** convert ieee floating point number to an integer ***
- ************************************************************
- getieee7200:
- move.l a0,-(sp)
- bsr pgetl
- clr.l d1
- tst.l d0 ;is it all zero
- beq ftoi3 ;yes
-
- cmp.l #$ffffffff,d0
- beq ftoi4
-
- clr.b sign
- move.l d0,d2
- btst #31,d2 ;is the sign bit on?
- beq ftoi0 ;nope
-
- move.b #1,sign
-
- ftoi0: move.l d0,d2
- and.l #$7f800000,d2 ;get exponent into d2
- move.l #23,d1
- lsr.l d1,d2
- sub.b #127,d2
- ext.w d2
- ext.l d2
- move.l d2,-(sp) ;save for later
-
- and.l #$007fffff,d0 ;get mantissa into d1
- or.l #$00800000,d0
-
- move.l fact1,d1 ;inch, pica, or cm conversion factor
- bsr Mulu3232
-
- move.l #23,d2 ;normalize product
- ftoi1: lsr.l #1,d1 ;it will all be in d0 (lower 24 bits)
- roxr.l #1,d0
- dbf d2,ftoi1
-
- move.l (sp)+,d2 ;get exponent back into d2
- add.l exp1,d2 ;add exponent for fact1
-
- move.l #45,d3
- sub.l d2,d3 ;subtract 45-d2 = number of lsr's -1
-
- ftoi2: lsr.l #1,d0
- dbf d3,ftoi2
-
- tst.b sign
- beq ftoi3
-
- not.l d0
- addq #1,d0
-
-
- ftoi3: moveq.l #1,d1 ;set cc to not zero for return
-
- ftoi4: move.l (sp)+,a0
- rts
-
- ************************************************************
- *** convert ieee floating point number to an integer ***
- ************************************************************
- getieee:
- move.l a0,-(sp)
- bsr pgetl
- clr.l d1
-
- tst.l d0 ;is it all zero
- beq gtie3 ;yes
-
- cmp.l #$ffffffff,d0 ;check for the INDICATOR
- beq gtie4
-
- clr.b sign
- move.l d0,d2
- btst #31,d2
- beq gtie0
- move.b #1,sign
-
- gtie0: and.l #$7f800000,d2 ;get exponent into d2
- move.l #23,d1
- lsr.l d1,d2
- sub.b #127,d2
- ext.w d2
- ext.l d2
-
- and.l #$007fffff,d0 ;get mantissa into d1
- or.l #$00800000,d0
-
- move.l #22,d1 ;d2 = number of lsr's
- sub.l d2,d1
-
- gtie1: lsr.l #1,d0 ;convert to an integer
- dbf d1,gtie1
-
- tst.b sign
- beq gtie3
- not.l d0
- addq #1,d0
-
- gtie3: moveq.l #1,d1 ;set cc to not zero for return
-
- gtie4: move.l (sp)+,a0
- rts
-
-
- ***************************
- *** ***
- ***************************
- putobj: bsr adjobj ;adjust object to the page
- move.l table,a1
- move.l o_obj(a1),a1
- lea object,a0
- jsr (a1)
- beq errrts
-
- rts
-
- ***************************
- *** ***
- ***************************
- checkLR:
- btst #0,flag ;is there a bounding box?
- bne cklr2 ;yes!
-
- cmp.l object+ob_Left,d0
- bge cklr1
- move.l d0,object+ob_Left
- cklr1: cmp.l object+ob_Right,d0
- ble cklr2
- move.l d0,object+ob_Right
- cklr2: rts
-
- ***************************
- *** ***
- ***************************
- checkTB:
- btst #0,flag ;is there a boundoing box?
- bne cktb2 ;yes!
-
- cmp.l object+ob_Top,d0
- bge cktb1
- move.l d0,object+ob_Top
- cktb1: cmp.l object+ob_Bottom,d0
- ble cktb2
- move.l d0,object+ob_Bottom
- cktb2: rts
-
- ***************************
- *** ***
- ***************************
- setobjdef:
- clr.b object+ob_Flag
- clr.w object+ob_Slant
- clr.w object+ob_Twist
-
- move.b #1,object+ob_LColor ;black line
- move.w #50,object+ob_LWidth ;line width (1 point)
- move.b #1,object+ob_LType ;line type = solid
-
- move.b #1,object+ob_FColor ;solid black fill
- move.b #0,object+ob_FType ;fill type 0 = none
-
- clr.b object+ob_LBegin
- clr.b object+ob_LEnd
- clr.w object+ob_HStandOff
- clr.w object+ob_VStandOff
-
- rts
-
- ***************************
- *** ***
- ***************************
- adjcoords: ;a0 = start address
- move.l object+ob_Left,d1 ;d0 = number of 'commands'
- move.l object+ob_Top,d2
- move.l d0,saved0
- move.l a0,savea0
- bra adjc3
-
- adjc1: move.w (a0)+,d3
- cmp.w #STROKEPATH,d3 ;skip STROKEPATH
- beq adjc3
-
- cmp.w #FILLPATH,d3 ;skip FILLPATH
- beq adjc3
-
- cmp.w #NEWPATH,d3 ;skip NEWPATH
- beq adjc3
-
- cmp.w #CLOSEPATH,d3 ;skip CLOSEPATH
- beq adjc3
-
- cmp.w #CURVETO,d3
- beq adjc2
-
- sub.l d1,(a0)+ ;LINETO & MOVETO have 1 point
- sub.l d2,(a0)+
- bra adjc3
-
- adjc2: sub.l d1,(a0)+ ;CURVETO has 3 points
- sub.l d2,(a0)+
- sub.l d1,(a0)+
- sub.l d2,(a0)+
- sub.l d1,(a0)+
- sub.l d2,(a0)+
-
- adjc3: dbf d0,adjc1
-
- btst #0,flag2
- beq adjc10
-
- move.l saved0,d0
- move.l savea0,a0
- move.l object+ob_Right,d1
- sub.l object+ob_Left,d1
- bra adjc6
-
- adjc4: move.w (a0)+,d3 ;get the command
-
- cmp.w #STROKEPATH,d3 ;skip STROKEPATH
- beq adjc6
-
- cmp.w #FILLPATH,d3 ;skip FILLPATH
- beq adjc6
-
- cmp.w #NEWPATH,d3 ;skip NEWPATH
- beq adjc6
-
- cmp.w #CLOSEPATH,d3 ;skip CLOSEPATH
- beq adjc6
-
- cmp.w #CURVETO,d3
- beq adjc5
-
- move.l d1,d2 ;adjust the X coord
- sub.l (a0),d2
- move.l d2,(a0)+
- add.l #4,a0 ;skip over the Y coord
-
- bra adjc6
-
- adjc5: move.l d1,d2 ;adjust the X coord
- sub.l (a0),d2
- move.l d2,(a0)+
- add.l #4,a0 ;skip over the Y coord
-
- move.l d1,d2 ;adjust the X coord
- sub.l (a0),d2
- move.l d2,(a0)+
- add.l #4,a0 ;skip over the Y coord
-
- move.l d1,d2 ;adjust the X coord
- sub.l (a0),d2
- move.l d2,(a0)+
- add.l #4,a0 ;skip over the Y coord
-
- adjc6: dbf d0,adjc4
-
- adjc10: btst #1,flag2
- beq adjc20
-
- move.l saved0,d0
- move.l savea0,a0
-
- move.l object+ob_Bottom,d1
- sub.l object+ob_Top,d1
- bra adjc19
-
- adjc11: move.w (a0)+,d3 ;get the command
-
- cmp.w #STROKEPATH,d3 ;skip STROKEPATH
- beq adjc19
-
- cmp.w #FILLPATH,d3 ;skip FILLPATH
- beq adjc19
-
- cmp.w #NEWPATH,d3 ;skip NEWPATH
- beq adjc19
-
- cmp.w #CLOSEPATH,d3 ;skip CLOSEPATH
- beq adjc19
-
- cmp.w #CURVETO,d3
- beq adjc12
-
- ;add.l #4,a0 ;skip over the X coord
- ;move.l d1,d2 ;adjust the Y coord
- ;sub.l (a0),d2
- ;move.l d2,(a0)+
-
- add.l #4,a0
- move.l (a0),d2
- neg.l d2
- add.l d1,d2
- move.l d2,(a0)+
- bra adjc19
-
- adjc12: add.l #4,a0 ;skip over the X coord
- ;move.l d1,d2 ;adjust the Y coord
- ;sub.l (a0),d2
- ;move.l d2,(a0)+
- move.l (a0),d2
- neg.l d2
- add.l d1,d2
- move.l d2,(a0)+
-
- add.l #4,a0 ;skip over the X coord
- ;move.l d1,d2 ;adjust the Y coord
- ;sub.l (a0),d2
- ;move.l d2,(a0)+
- move.l (a0),d2
- neg.l d2
- add.l d1,d2
- move.l d2,(a0)+
-
- add.l #4,a0 ;skip over the X coord
- ;move.l d1,d2 ;adjust the Y coord
- ;sub.l (a0),d2
- ;move.l d2,(a0)+
- move.l (a0),d2
- neg.l d2
- add.l d1,d2
- move.l d2,(a0)+
-
- adjc19: dbf d0,adjc11
-
- adjc20: rts
-
-
- ***********************************
- *** ***
- ***********************************
- adjobj:
- btst #0,flag2
- beq adjo1
-
- move.l object+ob_Right,d1
- move.l object+ob_Left,object+ob_Right
- move.l d1,object+ob_Left
-
- move.l xleft,d1
- sub.l xright,d1
- move.l object+ob_Left,d2
- neg.l d2
- add.l d1,d2
- move.l d2,object+ob_Left
-
- move.l object+ob_Right,d2
- neg.l d2
- add.l d1,d2
- move.l d2,object+ob_Right
-
- adjo1: btst #1,flag2
- beq adjo2
-
- move.l object+ob_Top,d1
- move.l object+ob_Bottom,object+ob_Top
- move.l d1,object+ob_Bottom
-
- move.l ytop,d1
- sub.l ybottom,d1
- move.l object+ob_Top,d2
- neg.l d2
- add.l d1,d2
- move.l d2,object+ob_Top
-
- move.l object+ob_Bottom,d2
- neg.l d2
- add.l d1,d2
- move.l d2,object+ob_Bottom
-
- adjo2: rts
-
- ***********************************
- *** ***
- ***********************************
- addcolor:
- movem.l a0/a1,-(sp)
- move.l d0,d1
- move.l d0,curcolor ;save for getcolorname
- clr.l d0 ;init pgs color to zero
-
- tst.l cmyktab ;is there a cmyk definition ?
- beq addc0 ;no, so check for a rgb def
- and.l #$0000ffff,d1
- clr.l d4
- mulu #5,d1
- move.w d1,d4
- move.l cmyktab,a0
- move.l (a0),a0
- move.b 0(a0,d4.w),d0
- tst.b d0 ;has this color been added already?
- bne addc6 ;yes, so get out d0=pgs color #
-
- move.w d4,-(sp) ;save color code for later
-
- clr.l d0
- clr.l d1
- clr.l d2
- clr.l d3
- move.b 1(a0,d4.w),d0 ;cyan
- move.b 2(a0,d4.w),d1 ;magenta
- move.b 3(a0,d4.w),d2 ;yellow
- move.b 4(a0,d4.w),d3 ;black
- move.b d0,cyan
- move.b d1,magenta
- move.b d2,yellow
- move.b d3,black
-
- mulu #10000,d0 ;scale 0-255 cmyk to 0-10000 cmyk
- divu #255,d0
- mulu #10000,d1
- divu #255,d1
- mulu #10000,d2
- divu #255,d2
- mulu #10000,d3
- divu #255,d3
-
- bra addc4 ;add the color from the cmyk defs
-
- addc0: tst.l cmaptab ;is there a rgb cmap definition?
- beq addc6 ;no, so use default color
- and.l #$0000ffff,d1
- clr.l d4
- lsl.w #2,d1
- move.w d1,d4
- move.l cmaptab,a0
- move.l (a0),a0
- move.b 0(a0,d4.w),d0
- tst.b d0 ;has this color been added already?
- bne addc6 ;yes, so get out d0=pgs color #
-
- move.w d4,-(sp) ;save color code for later
-
- clr.l d0
- clr.l d1
- clr.l d2
- clr.l d3
- move.b 1(a0,d4.w),d0 ;red
- move.b 2(a0,d4.w),d1 ;green
- move.b 3(a0,d4.w),d2 ;blue
- move.b d0,red
- move.b d1,green
- move.b d2,blue
-
- mulu #10000,d0 ;scale 0-255 rgb to 0-10000 rgb
- divu #255,d0
- mulu #10000,d1
- divu #255,d1
- mulu #10000,d2
- divu #255,d2
-
- addc03: move.w d0,d3 ;find largest rgb value (in d3)
- cmp.w d3,d1
- bls addc1
- move.w d1,d3
- addc1: cmp.w d3,d2
- bls addc2
- move.w d2,d3
- addc2: tst.w d3 ;is the largest value 0?
- bne addc3
- clr.w d0
- clr.w d1
- clr.w d2
- move.w #10000,d3
- bra addc4
-
- addc3: mulu #10000,d0
- divu d3,d0
- mulu #10000,d1
- divu d3,d1
- mulu #10000,d2
- divu d3,d2
-
- addc32: neg.w d0
- add.w #10000,d0
-
- neg.w d1
- add.w #10000,d1
-
- neg.w d2
- add.w #10000,d2
-
- neg.w d3
- add.w #10000,d3
-
- addc4: move.w d0,color+cl_Cyan
- move.w d1,color+cl_Magenta
- move.w d2,color+cl_Yellow
- move.w d3,color+cl_Black
- clr.w color+cl_Type
- clr.w color+cl_Map
-
- bsr getcolorname
-
- move.l colorname,a0 ;copy the color name into cl_Name
-
- lea color+cl_Name,a1
- move.w #21,d0
- addc5: move.b (a0)+,(a1)+
- dbf d0,addc5
- clr.b (a1)+ ;null terminate it
-
- lea color,a0 ;add the color to the global color tab
- move.l table,a1
- move.l newcolor(a1),a1
- jsr (a1)
- move.l d0,saved0
-
- lea color,a0 ;add the color to the doc color tab
- move.l table,a1
- move.l findcolorname(a1),a1
- jsr (a1)
- cmp.w #$ffff,d0
- bne addc51
-
- move.l saved0,d0
-
- addc51: move.w (sp)+,d1
- tst.l cmyktab ;is there a cmyk definition?
- beq addc52 ;no
- move.l cmyktab,a0
- bra addc53
- addc52: move.l cmaptab,a0 ;use the rgb definition
- addc53: move.l (a0),a0
- move.b d0,0(a0,d1.w) ;store the pgscolor in the colortab
-
- addc6: movem.l (sp)+,a0/a1
- rts
-
- ***********************************
- *** ***
- ***********************************
- getcolorname:
- tst.l cnamtab ;is there a cnam chunk to use?
- beq gcn10 ;no
- move.l cnamtab,a0
- move.l (a0),a0
- move.l curcolor,d0
- lsl.l #2,d0
- add.l d0,a0
- move.l (a0),a0 ;get mem handle for color name pointer
- move.l (a0),colorname ;set it up and rts
- bra gcn30
-
- gcn10: tst.l cmyktab ;is there a cmyk definition?
- beq gcn20 ;no
- move.b cyan,d0 ;set up colorname for rgb definition
- bsr hex2ascii
- move.b d0,defcolorname+4
- move.b d1,defcolorname+5
- move.b magenta,d0
- bsr hex2ascii
- move.b d0,defcolorname+6
- move.b d1,defcolorname+7
- move.b yellow,d0
- bsr hex2ascii
- move.b d0,defcolorname+8
- move.b d1,defcolorname+9
- move.b black,d0
- bsr hex2ascii
- move.b d0,defcolorname+10
- move.b d1,defcolorname+11
- clr.b defcolorname+12
- lea defcolorname,a0 ;set the colorname to the default name
- move.l a0,colorname
- bra gcn30
-
- gcn20: tst.l cmaptab ;is there a rgb definition?
- beq gcn30 ;no
- move.b red,d0 ;set up colorname for rgb definition
- bsr hex2ascii
- move.b d0,defcolorname+4
- move.b d1,defcolorname+5
- move.b green,d0
- bsr hex2ascii
- move.b d0,defcolorname+6
- move.b d1,defcolorname+7
- move.b blue,d0
- bsr hex2ascii
- move.b d0,defcolorname+8
- move.b d1,defcolorname+9
- clr.b defcolorname+10
- lea defcolorname,a0 ;set the colorname to the default name
- move.l a0,colorname
-
- gcn30: rts
-
- ***********************************
- *** ***
- ***********************************
- hex2ascii:
- move.b d0,d1
- and.b #$f0,d0 ;d0 = upper nibble
- lsr.b #4,d0
- and.b #$0f,d1 ;d1 = lower nibble
-
- cmp.b #$0a,d0 ;is d0 greater or equal to 10
- bcc h2a1 ;yes
- or.b #$30,d0 ;if not make it into the ascii of 0-9
- bra h2a2
- h2a1: add.b #55,d0 ;make it ascii A-F
-
- h2a2: cmp.b #$0a,d1
- bcc h2a3
- or.b #$30,d1
- bra h2a4
- h2a3: add.b #55,d1
-
- h2a4: rts
-
- ***********************************
- *** ***
- ***********************************
- putcnam:
- move.l end,d0 ;d0 = number of names to deal with
- sub.l start,d0
-
- move.l cnamtab,a0 ;find the starting index pointer - a0
- move.l (a0),a0
- move.l start,d1
- lsl.l #2,d1
- add.l d1,a0
-
- move.l cnamchunk,a1 ;get the pointer to the chunk data in a1
- move.l (a1),a1
-
- pcn0: clr.l d1 ;get the length of the string into d1
- move.l a1,a2
- pcn1: tst.b (a2)+
- beq pcn2
- addq #1,d1
- bra pcn1
-
- pcn2: bsr getmem ;allocate d1 +1 bytes - return in a2
- move.l a2,(a0)+ ;store in table & move to next slot
-
- move.l (a2),a2 ;strcpy into the table space
- pcn3: move.b (a1)+,(a2)+
- dbf d1,pcn3
-
- dbf d0,pcn0
- rts
-
- ***********************************
- *** ***
- ***********************************
- getmem:
- movem.l d0-d1/a0-a1,-(sp)
- move.l d1,d0
- addq #1,d0
- clr.l d1
- clr.l d2
- move.l table,a0
- move.l m_alloc(a0),a0
- jsr (a0)
- beq errrts
- move.l a0,a2
- movem.l (sp)+,d0-d1/a0-a1
- rts
-
- ***********************************
- *** ***
- ***********************************
- errrts:
- bsr freemem
- move.l savesp,sp
- jmp abortobj
-
- ***********************************
- *** ***
- ***********************************
- freemem:
- tst.l cmaptab ;is there a cmaptab to delete?
- beq fm1 ;no
- move.l cmaptab,a0
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- fm1: tst.l cmyktab ;is there a cmyktab to delete?
- beq fm2 ;no
- move.l cmyktab,a0
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- fm2: tst.l cnamtab ;is there a cnamtab to delete?
- beq fm3 ;no
-
- ;free pointers in table
- move.w numcolors,tempw1
- move.l cnamtab,a2
- move.l (a2),a2
-
- fm20: move.l (a2)+,d0 ;get the next pointer to free
- beq fm21 ;is it zero? yes,so go to the next one
- move.l d0,a0
- move.l a2,-(sp)
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
- move.l (sp)+,a2
- fm21: sub.w #1,tempw1
- bne fm20
-
- move.l cnamtab,a0 ;free the table of pointers itself
- move.l table,a1
- move.l m_delete(a1),a1
- jsr (a1)
-
- fm3: rts
-
- *******************************************************************
- *** called when the import routine choosen finds something ***
- *** wrong with the file loaded. ***
- *******************************************************************
- never: clr.w d0
- rts
-
- maybe: move.w #1,d0
- rts
-
- right: move.w #2,d0
- rts
-
-
- *************************************************************
- *************************************************************
- SECTION DR2D,DATA,PUBLIC
-
- chunks: dc.l "ATTR",attr
- dc.l "AROW",arow
- dc.l "BBOX",bbox
- dc.l "CMAP",cmap
- dc.l "CMYK",cmyk
- dc.l "CNAM",cnam
- dc.l "CPLY",cply
- dc.l "DASH",dash
- dc.l "DRHD",drhd
- dc.l "FILL",fill
- dc.l "FONS",fons
- dc.l "FORM",form
- dc.l "GRUP",grup
- dc.l "OPLY",oply
- dc.l "PPRF",pprf
- dc.l "STXT",stxt
- dc.l 0,skip
-
- numchunks:
- dc.w 16
-
- special:
- dc.w 1
- dc.l spcl1
-
- version: dc.b 0,"$VER: "
- name: dc.b "IFF DR2D v2.1.5",0
-
- spcl1: dc.b "Object",0
-
- inch: dc.b "Units=Inch",0
- pica: dc.b "Units=Pica",0
- cm: dc.b "Units=Cm",0
-
- defcolorname: dc.b "DR2D",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
- serifflag: dc.b 0
-
-
- ******************************************************************
- ******************************************************************
- SECTION DR2D,BSS,PUBLIC
-
- savesp: ds.l 1
- length: ds.l 1
- clength: ds.l 1
- temp: ds.l 1
- object: ds.w ob_SizeOf/2
- column: ds.w cm_Sizeof/2
- color: ds.w cl_Sizeof/2
-
- count: ds.w 1
- len: ds.w 1
- flag: ds.l 1
- flag2: ds.l 1
- mptr: ds.l 1
- pptr: ds.l 1
- numcom: ds.w 1
- fillvalue: ds.w 1
- filltype: ds.b 1
- jointype: ds.b 1
- edgepattern: ds.b 1
- arrowhead: ds.b 1
- linewidth: ds.l 1
- edgecolor: ds.w 1
- numchars: ds.w 1
- charw: ds.l 1
- charh: ds.l 1
- basex: ds.l 1
- basey: ds.l 1
- rotation: ds.l 1
- string: ds.l 1
- numchars2: ds.w 1
- aflags: ds.w 1
- dashid: ds.w 1
- numdashes: ds.w 1
- dashtable: ds.b 256
- arrowtable: ds.b 256
- buffer: ds.b 512
- fact1: ds.l 1
- exp1: ds.l 1
- fact100: ds.w 1
- numobjs: ds.w 1
- gsp: ds.l 1
- numcolors: ds.w 1
- tempw1: ds.w 1
- start: ds.l 1
- end: ds.l 1
- red: ds.b 1
- green: ds.b 1
- blue: ds.b 1
- cyan: ds.b 1
- magenta: ds.b 1
- yellow: ds.b 1
- black: ds.b 1
- white: ds.b 1
- cmaptab: ds.l 1
- cmyktab: ds.l 1
- cnamtab: ds.l 1
- sign: ds.w 1
- fontid: ds.w 1
- prevx: ds.l 1
- prevy: ds.l 1
- saveX: ds.l 1
- saveY: ds.l 1
- saved0: ds.l 1
- savea0: ds.l 1
- xleft: ds.l 1
- ytop: ds.l 1
- xright: ds.l 1
- ybottom: ds.l 1
- colorname: ds.l 1
- cnamchunk: ds.l 1
- curcolor: ds.l 1
- fonttable: ds.l 256
-
- ;***************************** Changes **************************
- ;
- ; version 2.1.5
- ;
- ; - added a version string, so 'version dr2d.import' will return
- ; the version number of the module.
- ;
- ; - added font support - if the font specified in the FONS chunk is
- ; available to PageStream it will use it, if not it will use a serif
- ; or san-serif font (CSTimes or CSTriumvirate) depending on the flag
- ; in the FONS chunk.
- ;
- ; - added support for the new CMYK chunk. The module will use the CMYK
- ; definition if present, if not it will use the rgb (CMAP) definition
- ; for the color values.
- ;
- ; - added support for the new CNAM chunk. The module will use the name
- ; from the CNAM chunk if present, otherwise it will construct a name
- ; from the CMYK definition if present, if not, it will construct the
- ; name from the rgb (CMAP) definition.
- ;
- ; - fixed a bug that would cause PgS to crash when the object was pasted.
- ; this occured because a CPLY was identified as a line at the start of
- ; the object processing code (it had 2 points) and not at the end -
- ; because it was suppose to be filled.
- ;
- ;
- ; version 2.1.4 (uploaded 4/20/91 ?)
- ;
- ; - fixed bug when placing text objects (stxt chunks). Before it would
- ; use the baseline as the top of the object, now it uses it as the
- ; baseline and calculates the top and bottom of the object using the
- ; baseline as a reference.
- ;
- ;
- ; version 2.1.3 (shipped with PgS2.1 12/7/90)
- ;
- ; - now handles different coordinate systems (different zero origin)
- ;
- ;
- ; version 2.1.2
- ;
- ; - fixed color bug that occured when trying to add predefined
- ; color with a different name (ie. Black = DR2D000000)
- ;
- ;
- ; version 2.1.1 (uploaded 11/16/90)
- ;
- ; - fixed bug when first point of the curve is not the same as the
- ; prev point.
- ;
- ;
- ; version 2.1.0 (needs PgS 2.1.0)
- ;
- ; - added support for group objects
- ;
- ; - added suport for color
- ;
- ; - fixed negative floating point number bug
- ;
- ; - fixed line width - now no longer divides dr2d line width by 100
- ;
- ; - fixed text import bug
- ;
- ; - now detects serif and sanserif text objects
- ;
- ; - fixed bug in poly stuff - changed tdln dection method
- ;
- ;
- ; version 2.0.1
- ;
- ; - added supported for CURVETO and MOVETO in same case (0x00000003)
- ;
- ; - fix bug that caused divide by zero error when an old dr2d file
- ; was imported. this was caused by a lack of pprf chunk. this in
- ; turn would never set up the conversion factors so they would
- ; be zero - hence the divide by zero error!. this has been fixed.
- ;
- ;
- ; version 2.0.0
- ;
- ; - first release
-